package xin.marcher.module.construction.strategy.status;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xin.marcher.module.common.enums.DelFlagEnum;
import xin.marcher.module.common.enums.construction.ItemTypeEnum;
import xin.marcher.module.common.enums.construction.ProductExceptionCode;
import xin.marcher.module.common.exception.BaseBizException;
import xin.marcher.module.common.utils.DateFormatUtil;
import xin.marcher.module.common.utils.JsonUtil;
import xin.marcher.module.construction.converter.ProductConverter;
import xin.marcher.module.construction.domain.bo.AttributeExtendBO;
import xin.marcher.module.construction.domain.entity.AttributeExtendDO;
import xin.marcher.module.construction.domain.entity.FrontCategoryRelationDO;
import xin.marcher.module.construction.domain.entity.ItemInfoDO;
import xin.marcher.module.construction.domain.entity.ProductDetailDO;
import xin.marcher.module.construction.domain.request.ProductStatusRequest;
import xin.marcher.module.construction.repository.ProductStatusRepository;
import xin.marcher.module.construction.strategy.route.AbstractStatusStrategy;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 试销上架状态变更
 */
@Service
public class TrialSaleStatusService extends AbstractStatusStrategy {

    @Resource
    private ProductConverter productConverter;

    @Resource
    private ProductStatusRepository productStatusRepository;


    @Value("${trial.date-num}")
    private Integer dateNum;

    /**
     * 准备上架状态 流转到试销上架
     *
     * @param productStatusRequest
     */
    @Transactional(rollbackFor = BaseBizException.class)
    @Override
    public void updateProductStatus(ProductStatusRequest productStatusRequest) {
        //1.验证商品和前台类目绑定关系,绑定关系有效
        checkFrontCategoryList(productStatusRequest.getItemId());
        //2. 验证商品数据是否完整
        ProductDetailDO productDetailDO = checkProductInfo(productStatusRequest.getItemId());
        //3.填入补充试销商品的扩展字段(试销期截止时间)
        buildAttributeContent(productDetailDO);
        //4.变更商品信息
        updateProduct(productDetailDO, productStatusRequest);
        //5. 发送商品消息变更通知对象（已做mysql+canal监听）

    }

    /**
     * 填充 试销商品的扩展字段(试销期截止时间)
     *
     * @param productDetailDO
     */
    private void buildAttributeContent(ProductDetailDO productDetailDO) {
        //1.只有普通商品或者组套商品才处理扩展信息的变化
        if (checkItemType(productDetailDO)) {
            // 获取试销期截止时间
            String trialSaleTime = DateFormatUtil.getDate(dateNum);
            //1.先获取到试销商品的原有扩展字段
            AttributeExtendDO attributeExtend = productStatusRepository.getAttributeExtend(productDetailDO.getItemId());
            AttributeExtendBO attributeExtendBO = null;
            // 没有已经存在的扩展信息
            if (!Objects.isNull(attributeExtend) || StringUtils.isBlank(attributeExtend.getAttributeContent())) {
                attributeExtendBO = new AttributeExtendBO();
            } else {
                attributeExtendBO = JsonUtil.json2Object(attributeExtend.getAttributeContent(), AttributeExtendBO.class);
            }
            attributeExtendBO.setTrialSaleTime(trialSaleTime);
            // 字段存储起来
            productDetailDO.setAttributeContent(JSONObject.toJSONString(attributeExtendBO));
        }
    }

    /**
     * 变更商品的状态
     *
     * @param productDetailDO
     * @param productStatusRequest
     */
    private void updateProduct(ProductDetailDO productDetailDO, ProductStatusRequest productStatusRequest) {
        ItemInfoDO itemInfoDO = productConverter.converterDO(productDetailDO);
        // 更新商品状态
        productStatusRepository.updateProductStatus(itemInfoDO, productStatusRequest.getItemStatus());
        if (checkItemType(productDetailDO)) {
            // 更新商品扩展信息
            productStatusRepository.updateAttributeExtend(productDetailDO);
        }
    }

    /**
     * 验证修改的商品是否是普通商品或者组套商品，其他类型商品不处理扩展信息的试销期截止时间扩展字段变更
     *
     * @param productDetailDO
     * @return
     */
    private Boolean checkItemType(ProductDetailDO productDetailDO) {
        if (productDetailDO.getItemType().equals(ItemTypeEnum.ORDINARY.getCode()) ||
                productDetailDO.getItemType().equals(ItemTypeEnum.STACK.getCode())) {
            return true;
        }
        return false;
    }

    /**
     * 验证商品的数据完整性,查询商品
     *
     * @param itemId
     */
    private ProductDetailDO checkProductInfo(String itemId) {
        // 查询商品的详情信息
        ProductDetailDO productDetailDO = productStatusRepository.queryProductDetail(itemId);
        // 验证商品完整性
        productStatusRepository.checkProductComplete(productDetailDO);
        return productDetailDO;
    }

    /**
     * 查询商品是否和前台类目存在绑定关系
     *
     * @param itemId
     */
    private void checkFrontCategoryList(String itemId) {
        // 获取类目绑定关系
        List<FrontCategoryRelationDO> frontCategoryRelationList = productStatusRepository.queryFrontCategoryList(itemId);

        //过滤状态，只保留有效的
        List<FrontCategoryRelationDO> categoryRelationDOList = frontCategoryRelationList.stream().filter(frontCategoryRelationDO -> {
            if (frontCategoryRelationDO.getDelFlag().equals(DelFlagEnum.EFFECTIVE.getCode())) {
                return true;
            }
            return false;
        }).collect(Collectors.toList());
        // 商品不存在有效的绑定关系，提示错误
        if (CollectionUtils.isEmpty(categoryRelationDOList)) {
            throw new BaseBizException(ProductExceptionCode.PRODUCT_CATEGORY_RELATION_NULL);
        }
    }
}
